Add Tennessee elderly property tax relief#8307
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8307 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 1 3 +2
Lines 23 47 +24
=========================================
+ Hits 23 47 +24
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
Converted this to draft for the same data-readiness reason as #8303, but scoped to property tax data. This PR relies on |
Create tn_refundable_credits variable and refundable.yaml list, and add tn_refundable_credits to household_refundable_state_credits. The relief now flows through household_refundable_state_tax_credits to household_net_income, mirroring the pattern used for WA Working Families Tax Credit (also a state without an income tax). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
c276acb to
771f837
Compare
hua7450
left a comment
There was a problem hiding this comment.
🔍 Program Review — Tennessee Elderly Property Tax Relief
Tennessee implements Tenn. Code Ann. § 67-5-702 property tax relief for low-income elderly homeowners (age ≥ 65) by prorating real-estate taxes over the relief-eligible portion of assessed value. The implementation is structurally sound and fully parameter-driven — eligibility operators, the 25% assessment mechanism, and the proration math all faithfully encode § 67-5-702. One confirmed CRITICAL value error remains, plus several should-address robustness, scoping, and test-coverage gaps.
Scope: PR changes only — 10 files (4 params, 3 variables, 2 tests, 1 changelog). Branch is 0 behind main.
Source Documents
| Document | Link |
|---|---|
| 2025 TN Comptroller Tax Relief Brochure (TY2025 values, p.2) | https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/TaxReliefBrochure.pdf#page=2 |
| Tenn. Code Ann. §§ 67-5-701–704 (§ 702 on p.3) | https://comptroller.tn.gov/content/dam/cot/pa/documents/tax-relief/tax%20relief%20tca.pdf#page=3 |
| Robertson County Trustee — TY2026 values ($33,600 / $38,470) | https://www.robertsoncountytn.gov/local_government/trustee/tax_relief.php |
🔴 Critical (Must Fix)
C1. 2026 property-value cap is wrong — should be $33,600, not $32,700
policyengine_us/parameters/gov/states/tn/tax/property/elderly_property_tax_relief/property_value_cap.yaml
values:
2025-01-01: 32_700
2026-01-01: 32_700 # WRONG — stale 2025 value frozen into 2026§ 67-5-702(a)(3)(B) requires the cap to be CPI-adjusted every tax year. $32,700 is the TY2025 value. The TY2026 cap is $33,600, verified against primary sources:
- Robertson County Trustee (program administrator): "payment of the tax on an 2026 appraised property value of up to $33,600."
- Corroborated by Nashville/Davidson, Blount County, and the AARP-TN guide; consistent with the parallel income-limit rise ($37,530 → $38,470) and the statute's mandated annual adjustment ($32,700 × ~1.0275 ≈ $33,600).
- The lone $32,700-for-2026 source (UT-MTAS) was last reviewed 12/11/2025, before the 2026 figures were set — it is stale.
Fix (one change, three coupled edits):
2026-01-01: 33_600 # TY2026 COLA-adjusted cap- Assessed cap $8,175 → $8,400 (= $33,600 × 25%)
tn_elderly_property_tax_relief.yamlCase 1 (period 2026): relief $327 → $336, comment → "33,600 × 25% = 8,400"- Repoint the 2026 reference to a 2026-specific source (Robertson County trustee; the Comptroller's 2026 brochure isn't posted until Oct 2026)
⚠️ Keep the2026-01-01entry — once corrected it is no longer a duplicate.
🟡 Should Address
| Finding | Location | |
|---|---|---|
| S1 | Unguarded / assessed_property_value → 0/0 = nan under vectorized microsim (defined_for masks output, not execution). Latent now (household-only), but SC/MS/KY all guard it. Fix: / max_(assessed_property_value, 1). (Rated CRITICAL by the code-pattern validator.) |
tn_elderly_property_tax_relief.py:27 |
| S2 | Assessed value + taxes summed over the whole tax unit incl. dependents; statute ties relief to the owner. SC/MS/KY scope to head/joint-spouse | ...relief.py:19,25; ..._eligible.py:24-25 |
| S3 | Income uses adjusted_gross_income proxy — omits untaxed SS / muni interest vs statutory "income from all sources"; variable has no reference or explanatory comment |
..._income.py:12 |
| S4 | 2026 income limit (38_470, value correct) cites the Tax Freeze doc for a Tax Relief param — program/document mismatch; prefer the brochure or § 67-5-702(a)(2) |
income_limit.yaml:13-14 |
| S5 | Param PDF hrefs lack #page= anchors (correct: brochure #page=2, statute § 702 #page=3) |
all 4 param files |
| S6 | assessment_rate cites § 67-5-801 (general); the operative 25% is in § 67-5-702(b)(2) — tighten primary citation |
assessment_rate.yaml |
| S7 | 2025 income limit only tested at $37,531 ($1 over); no at-/below-limit case and no 2025 positive-benefit case | both test yamls |
| S8 | Untested: assessed-value-at-cap boundary ($8,400 after C1); benefit var for a non-TN household; eligibility >0 gates as false |
both test yamls |
🟢 Suggestions
- G1.
assessment_rate.yamlsecondary ref is non-.govJustia — prefer the.govstatute PDF as primary (pairs with S6).
PDF Audit: 5 confirmed correct, 1 confirmed mismatch
| Parameter | Repo | Source | Status |
|---|---|---|---|
| age_threshold | 65 | 65 | ✅ |
| assessment_rate | 0.25 | 25% (§ 702(b)(2)) | ✅ |
| income_limit 2025 / 2026 | 37_530 / 38_470 | $37,530 / $38,470 | ✅ |
| property_value_cap 2025 | 32_700 | $32,700 market | ✅ |
| property_value_cap 2026 | 32_700 | $33,600 | ❌ mismatch |
Formula integrity confirmed: cap stored as MARKET value, assessment_rate applied exactly once.
⚖️ Review Severity: REQUEST_CHANGES
One confirmed CRITICAL value error (2026 cap), with the assessed-cap and 2026-test-case updates required as part of the same fix.
Summary
Modeling notes
real_estate_taxesto preserve local tax-rate differences.Tests
PYTHONPATH=. /Users/daphnehansell/Documents/GitHub/policyengine-us/.venv/bin/python -m policyengine_core.scripts.policyengine_command test policyengine_us/tests/policy/baseline/gov/states/tn/tax/property/elderly_property_tax_relief -c policyengine_us/Users/daphnehansell/Documents/GitHub/policyengine-us/.venv/bin/ruff check policyengine_us/variables/gov/states/tn/tax/property/elderly_property_tax_reliefCloses #8203